package com.librelato.persistencia;

import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import com.librelato.bean.CidadeBean;
import com.librelato.bean.CompradorBean;
import com.librelato.bean.CondicaoPagamentoBean;
import com.librelato.bean.EmpresaBean;
import com.librelato.bean.FornecedorBean;
import com.librelato.bean.PedidoBean;
import com.librelato.bean.ProdutoBean;
import com.librelato.bean.TransportadoraBean;
import com.librelato.persistencia.config.SQLConfiguracao;
import com.librelato.persistencia.enums.EnumCondicao;
import com.librelato.persistencia.interfaces.IPedidoDao;
import com.librelato.util.Ferramentas;

public class PedidoDao<P extends PedidoBean> extends DaoGenerico<P> implements
		IPedidoDao<P> {

	public PedidoDao() {
		df = new SimpleDateFormat("yyyyMMdd");
		df2 = new SimpleDateFormat("dd/MM/yy");
	}

	public void excluir(P p) throws Exception {
	};

	public void editar(P p) throws Exception {
	};

	@Override
	public List<PedidoBean> buscaPedidos(String dataDe, String dataAte,
			String numPedido, String status, String filial,
			String codFornecedor, boolean filtro) throws Exception {

		conn = null;
		ps = null;
		rs = null;
		query = null;
		List<PedidoBean> listaPedidos = new ArrayList<PedidoBean>();
		List<ProdutoBean> listaProdutos;
		PedidoBean pedido;
		EmpresaBean empresa;
		ProdutoBean produto;
		CompradorBean comprador;
		FornecedorBean fornecedor;
		query = SQLConfiguracao.getInstance().getValor(
				"localiza_numero_pedidos");
		String query2 = SQLConfiguracao.getInstance().getValor(
				"localiza_pedidos");
		conn = GerenciadorConexao.getConexao();

		try {
			if (filtro) {
				if (filial != null && !"".equals(filial.trim())
						&& !filial.trim().equals("0")) {
					query += " AND C7_FILIAL = '" + filial.trim() + "'";
					query2 += " AND C7_FILIAL = '" + filial.trim() + "'";
				}
				if (numPedido != null && !"".equals(numPedido.trim())) {
					query += " AND C7_NUM = '" + numPedido + "'";
					query2 += " AND C7_NUM = '" + numPedido + "'";
				}
				if (status != null && !"".equals(status.trim())) {
					if (status.equals("Aberto")) {
						query += " AND C7_QUJE < C7_QUANT";
					//	query += " AND C7_QUJE <> 0";
						query2 += " AND C7_QUJE < C7_QUANT";
					//	query2 += " AND C7_QUJE <> 0";
					} else if (status.equals("Atendido")) {
						query += " AND C7_QUJE = C7_QUANT";
						query2 += " AND C7_QUJE = C7_QUANT";
					}
				}
				if (dataDe != null && !"".equals(dataDe.trim())) {
					query += " AND C7_EMISSAO >= '"
							+ df.format(df2.parse(dataDe)) + "'";
					query2 += " AND C7_EMISSAO >= '"
							+ df.format(df2.parse(dataDe)) + "'";
				}
				if (dataAte != null && !"".equals(dataAte.trim())) {
					query += " AND C7_EMISSAO <= '"
							+ df.format(df2.parse(dataAte)) + "'";
					query2 += " AND C7_EMISSAO <= '"
							+ df.format(df2.parse(dataAte)) + "'";
				}
				query += " AND C7_TRNSP = A4_COD";
				query2 += " AND C7_TRNSP = A4_COD";
				query += " AND E4_CODIGO = C7_COND";
				query2 += " AND E4_CODIGO = C7_COND";
				query += " AND EMPRESAS.FILIAL = C7_FILIAL";
				query2 += " AND EMPRESAS.FILIAL = C7_FILIAL";
				query += " AND CIDADES.IDCIDADE = EMPRESAS.IDCIDADE";
				query2 += " AND CIDADES.IDCIDADE = EMPRESAS.IDCIDADE";
				query += " AND A2_COD = C7_FORNECE";
				query2 += " AND A2_COD = C7_FORNECE";
				query += " AND A2_LOJA = C7_LOJA";
				query2 += " AND A2_LOJA = C7_LOJA";
				query += " AND SE4010.D_E_L_E_T_ <> '*' ";
				query2 += " AND SE4010.D_E_L_E_T_ <> '*' ";
				query += " AND SA2010.D_E_L_E_T_ <> '*' ";
				query2 += " AND SA2010.D_E_L_E_T_ <> '*' ";
				query += " AND SA4010.D_E_L_E_T_ <> '*' ";
				query2 += " AND SA4010.D_E_L_E_T_ <> '*' ";
				query2 += " ORDER BY SC7010.C7_EMISSAO ASC ";
				ps = conn.prepareStatement(query);
				ps.setString(1, codFornecedor.trim());
				rs = ps.executeQuery();
				ResultSet rs2;
				while (rs.next()) {
					listaProdutos = new ArrayList<ProdutoBean>();
					ps = conn.prepareStatement(query2);
					ps.setString(1, codFornecedor.trim());
					ps.setString(2, rs.getString("C7_NUM"));
					rs2 = ps.executeQuery();

					if (rs2.next()) {

						pedido = new PedidoBean();
						comprador = new CompradorBean();
						comprador.setNome(rs2.getString("C7_COMPRAD")
								.toUpperCase());
						empresa = new EmpresaBean();
						empresa.setBairro(rs2.getString("EMPBAI"));
						empresa.setCep(rs2.getString("EMPCEP"));
						empresa.setCidade(rs2.getString("CIDNOME"));
						empresa.setCnpj(formatar(rs2.getString("CNPJ"),
								"###.###.###/####-##"));
						empresa.setDescricao(rs2.getString("EMPDESCRI"));
						empresa.setEndereco(rs2.getString("EMPEND"));
						empresa.setFilial(rs2.getString("C7_FILIAL"));
						empresa.setInscriEstadual(rs2
								.getString("INSCRIESTADUAL"));
						empresa.setUf(rs2.getString("CIDUF"));
						fornecedor = new FornecedorBean();
						fornecedor.setBairro(rs2.getString("A2_BAIRRO"));
						fornecedor.setCep(rs2.getString("A2_CEP"));
						fornecedor.setCgc(rs2.getString("A2_CGC"));
						/*fornecedor.setCidade(rs2.getString("A2_MUN"));
						fornecedor.setEstado(rs2.getString("A2_EST"));
						*/
						fornecedor.setCidade(new CidadeBean(rs2.getString("A2_MUN").trim(), rs2.getString("A2_EST").trim()));
						fornecedor.setCodigo(rs2.getString("C7_FORNECE"));
						fornecedor.setContato(rs2.getString("A2_CONTATO"));
						fornecedor.setEmail(rs2.getString("A2_EMAIL"));
						fornecedor.setEndereco(rs2.getString("A2_END"));
						fornecedor.setFax(rs2.getString("A2_FAX"));
						fornecedor.setFone(rs2.getString("A2_FONE2"));
						fornecedor.setInscricaoEstadual(rs2
								.getString("A2_INSCR"));
						fornecedor.setLoja(rs2.getString("C7_LOJA"));
						fornecedor.setNome(rs2.getString("A2_NOME"));

						pedido.setCondPag(new CondicaoPagamentoBean(rs2
								.getString("C7_COND"), null, rs2
								.getString("E4_DESCRI")));
						pedido.setComprador(comprador);
						pedido.setDtEmissao((Date) df.parse(rs2
								.getString("C7_EMISSAO")));
						if (!"".equals(rs2.getString("C7_DATPRF").trim())) {
							pedido.setDtEntrega((Date) df.parse(rs2
									.getString("C7_DATPRF")));
						}
						if (!"".equals(rs2.getString("C7_DTVIFOR").trim())) {
							pedido.setDtVisualizado((Date) df.parse(rs2
									.getString("C7_DTVIFOR")));
						}
						pedido.setEmpresa(empresa);
						pedido.setFornecedor(fornecedor);
						pedido.setIpi(rs2.getDouble("C7_IPI"));
						pedido.setNumeroPedido(rs2.getString("C7_NUM"));
						pedido.setObservacao(rs2.getString("C7_OBS"));

						pedido.setQtdeAtendida(rs2.getDouble("C7_QUJE"));
						pedido.setQuantidade(rs2.getDouble("C7_QUANT"));
						pedido.setTipoFrete(rs2.getString("C7_TPFRETE"));
						pedido.setTransportadora(new TransportadoraBean(rs2
								.getString("C7_TRNSP"), rs2
								.getString("A4_NOME")));
						pedido.setVlTotal(rs2.getDouble("C7_TOTAL"));
						rs2 = ps.executeQuery();
						while (rs2.next()) {
							produto = new ProdutoBean();
							produto.setCodigo(rs2.getString("C7_PRODUTO"));
							produto.setUnidMedida(rs2.getString("C7_UM"));
							produto.setDescricao(rs2.getString("C7_DESCRI"));
							produto.setItemPosicao(rs2.getString("C7_ITEM"));
							produto.setQtdeAtendida(rs2.getDouble("C7_QUJE"));
							produto.setQuantidade(rs2.getDouble("C7_QUANT"));
							produto.setIpi(rs2.getDouble("C7_IPI"));
							produto.setVlTotal(rs2.getDouble("C7_TOTAL"));
							produto.setObservacao(rs2.getString("C7_OBS"));
							if (!"".equals(rs2.getString("C7_DATPRF").trim())) {
								produto.setDtEntrega((Date) df.parse(rs2
										.getString("C7_DATPRF")));
							}
							listaProdutos.add(produto);
						}
						pedido.setListaProdutos(listaProdutos);
						listaPedidos.add(pedido);
					}
				}
			} else {

				query += " AND C7_QUJE < C7_QUANT";
				query += " AND C7_TRNSP = A4_COD";
				query += " AND E4_CODIGO = C7_COND";
				query += " AND EMPRESAS.FILIAL = C7_FILIAL";
				query += " AND CIDADES.IDCIDADE = EMPRESAS.IDCIDADE";
				query += " AND A2_COD = C7_FORNECE";
				query += " AND A2_LOJA = C7_LOJA";
				query += " AND SE4010.D_E_L_E_T_ <> '*' ";
				query += " AND SA2010.D_E_L_E_T_ <> '*' ";
				query += " AND SA4010.D_E_L_E_T_ <> '*' ";
				query2 += " AND C7_TRNSP = A4_COD";
				query2 += " AND E4_CODIGO = C7_COND";
				query2 += " AND EMPRESAS.FILIAL = C7_FILIAL";
				query2 += " AND CIDADES.IDCIDADE = EMPRESAS.IDCIDADE";
				query2 += " AND A2_COD = C7_FORNECE";
				query2 += " AND A2_LOJA = C7_LOJA";
				query2 += " AND SE4010.D_E_L_E_T_ <> '*' ";
				query2 += " AND SA2010.D_E_L_E_T_ <> '*' ";
				query2 += " AND SA4010.D_E_L_E_T_ <> '*' ";
				query2 += " ORDER BY SC7010.C7_EMISSAO ASC ";
				ps = conn.prepareStatement(query);
				ps.setString(1, codFornecedor.trim());
				rs = ps.executeQuery();
				ResultSet rs2;
				while (rs.next()) {
					listaProdutos = new ArrayList<ProdutoBean>();
					ps = conn.prepareStatement(query2);
					ps.setString(1, codFornecedor.trim());
					ps.setString(2, rs.getString("C7_NUM"));
					rs2 = ps.executeQuery();

					if (rs2.next()) {

						pedido = new PedidoBean();
						comprador = new CompradorBean();
						comprador.setNome(rs2.getString("C7_COMPRAD")
								.toUpperCase());
						empresa = new EmpresaBean();
						empresa.setBairro(rs2.getString("EMPBAI"));
						empresa.setCep(rs2.getString("EMPCEP"));
						empresa.setCidade(rs2.getString("CIDNOME"));
						empresa.setCnpj(formatar(rs2.getString("CNPJ"),
								"###.###.###/####-##"));
						empresa.setDescricao(rs2.getString("EMPDESCRI"));
						empresa.setEndereco(rs2.getString("EMPEND"));
						empresa.setFilial(rs2.getString("C7_FILIAL"));
						empresa.setInscriEstadual(rs2
								.getString("INSCRIESTADUAL"));
						empresa.setUf(rs2.getString("CIDUF"));
						fornecedor = new FornecedorBean();
						fornecedor.setBairro(rs2.getString("A2_BAIRRO"));
						fornecedor.setCep(rs2.getString("A2_CEP"));
						fornecedor.setCgc(rs2.getString("A2_CGC"));
						/*fornecedor.setCidade(rs2.getString("A2_MUN"));
						fornecedor.setEstado(rs2.getString("A2_EST"));
						*/
						fornecedor.setCidade(new CidadeBean(rs2.getString("A2_MUN").trim(), rs2.getString("A2_EST").trim()));
						fornecedor.setCodigo(rs2.getString("C7_FORNECE"));
						fornecedor.setContato(rs2.getString("A2_CONTATO"));
						fornecedor.setEmail(rs2.getString("A2_EMAIL"));
						fornecedor.setEndereco(rs2.getString("A2_END"));
						fornecedor.setFax(rs2.getString("A2_FAX"));
						fornecedor.setFone(rs2.getString("A2_FONE2"));
						fornecedor.setInscricaoEstadual(rs2
								.getString("A2_INSCR"));
						fornecedor.setLoja(rs2.getString("C7_LOJA"));
						fornecedor.setNome(rs2.getString("A2_NOME"));

						pedido.setCondPag(new CondicaoPagamentoBean(rs2
								.getString("C7_COND"), null, rs2
								.getString("E4_DESCRI")));
						pedido.setComprador(comprador);
						pedido.setDtEmissao((Date) df.parse(rs2
								.getString("C7_EMISSAO")));
						if (!"".equals(rs2.getString("C7_DATPRF").trim())) {
							pedido.setDtEntrega((Date) df.parse(rs2
									.getString("C7_DATPRF")));
						}
						if (!"".equals(rs2.getString("C7_DTVIFOR").trim())) {
							pedido.setDtVisualizado((Date) df.parse(rs2
									.getString("C7_DTVIFOR")));
						}
						pedido.setEmpresa(empresa);
						pedido.setFornecedor(fornecedor);
						pedido.setIpi(rs2.getDouble("C7_IPI"));

						pedido.setNumeroPedido(rs2.getString("C7_NUM"));
						pedido.setObservacao(rs2.getString("C7_OBS"));

						pedido.setQtdeAtendida(rs2.getDouble("C7_QUJE"));
						pedido.setQuantidade(rs2.getDouble("C7_QUANT"));
						pedido.setTipoFrete(rs2.getString("C7_TPFRETE"));
						pedido.setTransportadora(new TransportadoraBean(rs2
								.getString("C7_TRNSP"), rs2
								.getString("A4_NOME")));
						pedido.setVlUnitario(rs2.getDouble("C7_TOTAL"));
						rs2 = ps.executeQuery();
						while (rs2.next()) {
							produto = new ProdutoBean();
							produto.setCodigo(rs2.getString("C7_PRODUTO"));
							produto.setUnidMedida(rs2.getString("C7_UM"));
							produto.setDescricao(rs2.getString("C7_DESCRI"));
							produto.setItemPosicao(rs2.getString("C7_ITEM"));
							produto.setQtdeAtendida(rs2.getDouble("C7_QUJE"));
							produto.setQuantidade(rs2.getDouble("C7_QUANT"));
							produto.setIpi(rs2.getDouble("C7_IPI"));
							produto.setVlTotal(rs2.getDouble("C7_TOTAL"));
							produto.setObservacao(rs2.getString("C7_OBS"));
							if (!"".equals(rs2.getString("C7_DATPRF").trim())) {
								produto.setDtEntrega((Date) df.parse(rs2
										.getString("C7_DATPRF")));
							}
							listaProdutos.add(produto);
						}
						pedido.setListaProdutos(listaProdutos);
						listaPedidos.add(pedido);
					}
				}
			}
		} catch (Exception e) {
			throw e;
		}

		return listaPedidos;
	}

	public void atualizaDtVisu(PedidoBean pedido) throws Exception {

		conn = null;
		ps = null;
		query = null;

		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"altera_data_visu_pedido");
			ps = conn.prepareStatement(query);
			ps.setString(1, df.format(pedido.getDtVisualizado()));
			ps.setString(2, pedido.getEmpresa().getFilial());
			ps.setString(3, pedido.getNumeroPedido());
			ps.setString(4, pedido.getFornecedor().getCodigo().trim());
			ps.executeUpdate();
			conn.commit();

		} catch (Exception e) {
			throw e;
		}

	}

	@Override
	public byte[] imprime(PedidoBean pedido, String codRel) throws Exception {
		String jasper = Ferramentas.getDiretorioReal("/rel/RelPC.jasper");
		String pedPdf = Ferramentas.getDiretorioReal("/rel/") + "\\pedido" + codRel + ".pdf";
		byte[] bytes = null;
		try {
			conn = GerenciadorConexao.getConexao();
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("NUMEROPEDIDO", pedido.getNumeroPedido().trim());
			params.put("CODFORNECE", pedido.getFornecedor().getCodigo().trim());
			params.put("CODLOJA", pedido.getFornecedor().getLoja().trim());
			JasperPrint print = JasperFillManager.fillReport(jasper, params,
					conn);

			JasperExportManager.exportReportToPdfFile(print, pedPdf);
			bytes = JasperExportManager.exportReportToPdf(print);
			
		} catch (Exception e) {
			throw e;
		} finally {
		}
		return bytes;
	}
	

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		return null;
	}



	@Override
	public P salvar(P p) {
		return null;
	}

	@Override
	public void preSalvar(P p) {
	}

}
